/**
 * 标签管理Store
 * 提供标签列表的缓存和去重请求机制
 */
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { getTags } from '@/api/tags'
import type { Tag } from '@/types/tag'

export const useTagsStore = defineStore('tags', () => {
  // 状态
  const tags = ref<Tag[]>([])
  const loading = ref(false)
  const error = ref<string | null>(null)
  
  // 缓存和请求去重
  const isLoaded = ref(false)
  const loadingPromise = ref<Promise<Tag[]> | null>(null)
  
  /**
   * 获取标签列表（带缓存和请求去重）
   * @param forceRefresh 是否强制刷新
   */
  async function fetchTags(forceRefresh = false): Promise<Tag[]> {
    // 如果已加载且不是强制刷新，检查是否有进行中的请求
    if (!forceRefresh && isLoaded.value) {
      const existingPromise = loadingPromise.value
      if (existingPromise) {
        // 如果有正在进行的请求，等待它完成
        return await existingPromise
      }
      // 如果已加载且没有进行中的请求，直接返回缓存的数据
      if (tags.value.length > 0) {
        return tags.value
      }
    }
    
    // 检查是否有正在进行的请求
    const existingPromise = loadingPromise.value
    if (existingPromise) {
      // 如果有正在进行的请求，等待它完成而不是发起新请求
      return await existingPromise
    }
    
    // 创建新的请求Promise
    loading.value = true
    error.value = null
    
    const requestPromise = (async () => {
      try {
        const result = await getTags()
        const tagList = Array.isArray(result) ? result : []
        
        // 更新缓存
        tags.value = tagList
        isLoaded.value = true
        
        return tagList
      } catch (err: any) {
        error.value = err.message || '获取标签列表失败'
        // 请求失败时移除加载标记，允许重试
        isLoaded.value = false
        throw err
      } finally {
        loading.value = false
        // 请求完成后移除进行中的标记
        loadingPromise.value = null
      }
    })()
    
    // 保存请求Promise，以便其他组件可以等待同一个请求
    loadingPromise.value = requestPromise
    
    return requestPromise
  }
  
  /**
   * 清除缓存
   */
  function clearCache(): void {
    isLoaded.value = false
    tags.value = []
    loadingPromise.value = null
  }
  
  /**
   * 刷新标签列表
   */
  async function refreshTags(): Promise<Tag[]> {
    clearCache()
    return await fetchTags(true)
  }
  
  return {
    // 状态
    tags,
    loading,
    error,
    
    // 方法
    fetchTags,
    refreshTags,
    clearCache
  }
})

